package cn.edu.lcu.cs.javateaching.oop.innerclazz;

/**
 * 内部类演示
 * <li>创建一个包含内部类的类</li>
 * <li>内部类与外部类定义同名的字符串变量，初值不同</li>
 * <li>内部类中定义一个方法，分别打印外部类和内部类的变量</li>
 * 
 * @author Ling
 *
 */
public class Outter {

	private String strOfOutter = "strOfOutter";
	private String str = "String in outter";

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}

	public class Inner {
		private String str = "String in inner";

		public void printOfInner() {
			// 内部类可以直接访问外部类中的成员，前提是这个成员在内部外部类中没有重名
			System.out.println(strOfOutter);
			// 也可以通过外部类的this引用，访问外部类的成员
			System.out.println(Outter.this.strOfOutter);

			// str 这个成员在内部外部类中都有定义（重名），访问方式比较复杂
			System.out.println(str); // 内部类的方法，不加任何修饰，访问的是内部类的变量
			System.out.println(Outter.this.str); // 通过外部类的this引用，访问外部类的成员

			// 内部类调用外部的方法。即使外部类的方法是私有的，在内部类中也可以访问
			printOfOutter();
		}
	}

//	public static void main(String[] args) {
//		Outter outter = new Outter();
//		Inner inner = outter.new Inner(); // 用外部类实例创建内部类实例
//		inner.printOfInner();
//	}

	/**
	 * 外部类中定义的方法
	 */
	private void printOfOutter() {
		System.out.println(str); // 外部类中的方法访问的当然是外部类的变量
	}

}